﻿#include<iostream>
using namespace std;

typedef int StackTypeData;
class Stack
{
public:
	Stack()
		:array(nullptr)
		,_top(0)
		,_capacity(0)
	{};

	~Stack()
	{
		delete[](array);
		array = nullptr;
	}

	void CheckCapacity()
	{
		if (_capacity == 0)
		{
			StackTypeData* tmp = (StackTypeData*)malloc(sizeof(tmp) * 4);
			if (tmp != nullptr)
			{
				array = tmp;
			}
			_capacity = 4;
		}
		else if(_top == _capacity)
		{
			int* p = (StackTypeData*)realloc(array, sizeof(StackTypeData) * _capacity * 2);
			if (p != nullptr)
			{
				array = p;
			}
			_capacity *= 2;
		}
	}

	void Push(StackTypeData x)
	{	
		CheckCapacity();
		array[_top++] = x;
	}

	void Pop()
	{
		if (_top) _top--;
	}

	bool Empty()
	{
		cout << (_top == 0) << endl;
		return _top == 0;
	}

	StackTypeData Top()
	{
		if(_top) return array[_top - 1];
	}

	void Print()
	{
		if (_top)
		{
			for (int i = 0; i < _top; i++)
			{
				printf("%d ", array[i]);
			}
			printf("\n");
		}
	}


	StackTypeData* array;
	int _top;
	int _capacity;
};


class Queue
{
public:
	Queue() {};

	void Pop()
	{
		while (pushst._top > 0)
		{
			popst.Push(pushst.Top());
			pushst.Pop();
		}

		popst.Pop();

		while (popst._top > 0)
		{
			pushst.Push(popst.Top());
			popst.Pop();
		}
	}

	void Push(StackTypeData x)
	{
		pushst.Push(x);
	}

	StackTypeData Front()
	{
		if (pushst._top)
		{
			cout << pushst.array[0] << endl;
			return pushst.array[0];
		}
		return 0;
	}

	void Print()
	{
		pushst.Print();
	}

	~Queue() {};
private:
	Stack pushst;
	Stack popst;
};

int main()
{
	Queue q;
	for (int i = 0; i < 10; i++)
	{
		q.Push(i);
	}
	q.Print();
	q.Pop();
	q.Print();
	q.Pop();
	q.Print();
	q.Pop();
	q.Print();
}
//enum operatortion
//{
//	QUIT,
//	PUSH,
//	POP,
//	TOP,
//	EMPTY,
//	PRINT
//};
//
//void menu()
//{
//	cout << "*********************************************" << endl;
//	cout << "****1.Push  2.Pop  3.Top  4.Empty 5.Print****" << endl;
//	cout << "*********************************************" << endl;
//	cout << "**************    0.quit    *****************" << endl;
//}

//int main()
//{	
//	Stack st;
//	//int in = 0;
//	//do
//	//{	
//	//	menu();
//	//	cin >> in;
//	//	switch (in)
//	//	{
//	//	case QUIT:
//	//		cout << "退出" << endl;
//	//		break;
//	//	case PUSH:
//	//		st.Push();
//	//	case POP:
//	//		st.Pop();
//	//		break;
//	//	case TOP:
//	//		cout << st.Top() << endl;
//	//		break;
//	//	case EMPTY:
//	//		cout << st.Empty() << endl;
//	//		break;
//	//	case PRINT:
//	//		st.Print();
//	//		break;
//	//	}
//	//} while (in);
//	//st.Push(10);
//	//st.Push(0);
//	//st.Push(9);
//	//st.Empty();
//	//st.Print();
//	//st.Pop();
//	//st.Print();
//
//
//}

//#include<iostream>
//using namespace std;
//class A
//{
//public:
//	void Print()
//	{
//		cout << "A::Print()" << endl;
//		cout << _a << endl;
//	}
//private:
//	int _a;
//};
//int main()
//{
//	A* p = nullptr;
//	p->Print();
//	return 0;
//}